package com.fsc.controller;
import cn.dev33.satoken.stp.StpUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.fsc._enum.ReturnEnum;
import com.fsc.entity.ResultWrapper;
import com.fsc.entity.domain.ChatFriend;
import com.fsc.entity.domain.LoginInfo;
import com.fsc.entity.dto.AddFriendDTO;
import com.fsc.entity.vo.PersonContactListVO;
import com.fsc.entity.vo.PersonContactSearchVO;
import com.fsc.entity.vo.PersonWaitAddListVO;
import com.fsc.service.ChatFriendService;
import com.fsc.service.LoginInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 私聊通讯录
 */
@RestController
@RequestMapping("/person-contacts/")
public class PersonContactController {
    @Autowired
    private LoginInfoService loginInfoService;
    @Autowired
    private ChatFriendService chatFriendService;

    /**
     * 显示所有联系人
     * @return 所有联系人
     */
    @GetMapping("show-all")
    public ResultWrapper<List<PersonContactListVO>> showAll() {
        Integer id= StpUtil.getLoginIdAsInt();
        return ResultWrapper.success(ReturnEnum.SUCCESS,chatFriendService.getContractList(id));
    }

    /**
     * 搜索联系人
     * @param username 联系人用户名
     * @return 联系人信息
     */
    @GetMapping("search")
    public ResultWrapper<PersonContactSearchVO> search(@RequestParam String username) {
        String column=null;
        Integer id= StpUtil.getLoginIdAsInt();
        int statusCode=-1;
        if(loginInfoService.query().eq("username",username).exists()){
            column="username";
        } else if(loginInfoService.query().eq("phone",username).exists()){
            column="phone";
        } else if(loginInfoService.query().eq("id",username).exists()){
            column="id";
        }
        if(column==null){
            return ResultWrapper.fail(ReturnEnum.USER_NOT_EXIST,null);
        }
        LoginInfo loginInfo = loginInfoService.query().eq(column, username).one();
        //判断是否已经是好友.1是好友，0不是
        if(chatFriendService.query()
                .eq("friend_id",loginInfo.getId())
                .eq("user_id",id)
                .eq("status",1).exists()){
            statusCode=1;
        }
       PersonContactSearchVO contractSearchVO = PersonContactSearchVO.builder()
                .id(loginInfo.getId())
                .username(loginInfo.getUsername())
                .iconUrl(loginInfo.getIconUrl())
                .statusCode(statusCode)
                .build();
        return ResultWrapper.success(ReturnEnum.SUCCESS,contractSearchVO);
    }

    /**
     * 添加联系人
     * @param addFriendDTO 添加好友信息
     * @return 添加结果
     */
    @PostMapping("add")
    public ResultWrapper<String> add(@RequestBody AddFriendDTO addFriendDTO) {
        Integer id= StpUtil.getLoginIdAsInt();

        if(id.equals(addFriendDTO.getUserId())){
            return ResultWrapper.fail(ReturnEnum.FAIL,"不能添加自己为好友");
        }
        //双发互发处理覆盖
        if(chatFriendService.query()
                .eq("user_id",addFriendDTO.getUserId())
                .eq("friend_id",id)
                .eq("status",0).exists()){
                 chatFriendService.
                         update().
                         eq("friend_id",addFriendDTO.getUserId())
                         .eq("user_id",id).set("say_hello",addFriendDTO.getSayHello())
                         .update();
            return ResultWrapper.success(ReturnEnum.SUCCESS,"添加好友请求已发送");
        }
        //判断是否已经发送添加请求
        if(chatFriendService.query()
                .eq("user_id",id)
                .eq("friend_id",addFriendDTO.getUserId())
                .eq("status",0).exists()){
            chatFriendService.
                    update().
                    eq("user_id",id)
                    .eq("friend_id",addFriendDTO.getUserId())
                    .set("say_hello",addFriendDTO.getSayHello())
                    .set("friend_nickname",addFriendDTO.getNickname())
                    .update();
            return ResultWrapper.fail(ReturnEnum.SUCCESS,"等待对方接受请求中");
        }
        //没有发送过添加请求，创建表数据
        ChatFriend chatFriend = ChatFriend.builder()
                .userId(id)
                .friendId(addFriendDTO.getUserId())
                .createTime(LocalDateTime.now())
                .friendNickname(addFriendDTO.getNickname())
                .sayHello(addFriendDTO.getSayHello())
                .status(0)
                .build();
        chatFriendService.save(chatFriend);
        return ResultWrapper.success(ReturnEnum.SUCCESS,"添加好友请求已发送");
    }
    /**
     * 显示等待添加的联系人
     * @return 等待添加的联系人
     */
    @GetMapping("show-add")
    public ResultWrapper<List<PersonWaitAddListVO>> showAdd() {
        Integer id= StpUtil.getLoginIdAsInt();
           return ResultWrapper.success(ReturnEnum.SUCCESS,chatFriendService.getWaitAddList(id));
    }
    /**
     * 接受对方添加请求，作为friend_id写入对方的通讯录
     * @param addId 对方id
     * @param nickname 对方昵称
     * @return 添加结果
     */
    @GetMapping("accept")
    public ResultWrapper<String> accept(@RequestParam Integer addId,@RequestParam String nickname) {
        Integer id= StpUtil.getLoginIdAsInt();

        //接收就将好友写入通讯录
        ChatFriend chatFriend =ChatFriend.builder()
                .userId(id)
                .friendId(addId)
                .createTime(LocalDateTime.now())
                .friendNickname(nickname)
                .status(1)
                .build();
        chatFriendService.save(chatFriend);
        //将自己更新到对方的通讯录下
        chatFriendService.update().eq("user_id",addId).eq("friend_id",id).set("status",1).update();
        return ResultWrapper.success(ReturnEnum.SUCCESS,"已添加对方为好友");
    }
    /**
     * 拒绝对方添加请求
     * @param addId 对方id
     * @return 拒绝结果
     */
    @GetMapping("refuse")
    public ResultWrapper<String> refuse(@RequestParam Integer addId) {
        Integer id= StpUtil.getLoginIdAsInt();
        //拒绝就根据对方id和自己id删除对应的记录
        System.out.println(addId);
        Long mainId=chatFriendService.query().eq("user_id",addId).eq("friend_id",id).one().getId();
        chatFriendService.removeById(mainId);
        return ResultWrapper.success(ReturnEnum.SUCCESS,"已拒绝对方的好友请求");
    }
    /**
     * 删除联系人
     * @param friendId 联系人id
     * @return 删除结果
     */
    @GetMapping("delete")
    public ResultWrapper<String> delete(@RequestParam Integer friendId) {
        Integer id= StpUtil.getLoginIdAsInt();
        //删除就根据对方id和自己id删除对应的记录
        System.out.println(friendId);
        System.out.println(id);
        Long your_mainId=chatFriendService.query().eq("user_id",id).eq("friend_id",friendId).one().getId();
        Long his_mainId=chatFriendService.query().eq("user_id",friendId).eq("friend_id",id).one().getId();
        chatFriendService.removeById(your_mainId);
        chatFriendService.removeById(his_mainId);
        return ResultWrapper.success(ReturnEnum.SUCCESS,"已删除联系人");
    }
    /**
     * 重置备注
     * @param friendId 联系人id
     * @param nickname 联系人昵称
     * @return 重置结果
     */
    @GetMapping("reset")
    public ResultWrapper<String> reset(@RequestParam Integer friendId,@RequestParam String nickname) {
        Integer id= StpUtil.getLoginIdAsInt();
        //重置备注
       chatFriendService.update(Wrappers.<ChatFriend>lambdaUpdate().eq(ChatFriend::getUserId,id)
               .eq(ChatFriend::getFriendId,friendId)
               .set(ChatFriend::getFriendNickname,nickname));
        return ResultWrapper.success(ReturnEnum.SUCCESS,"修改成功");
    }

}
